home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
ldico02
/
ldico02s.lzh
/
LDICO.S
< prev
next >
Wrap
Text File
|
1997-04-05
|
26KB
|
1,125 lines
*********************************************************************************
* ICO Loader <LDICO.X Ver. 0.02> *
*********************************************************************************
.include doscall.mac
.include iocscall.mac
.include myconst.h
i_tate: equ $16
i_yoko: equ $1a
i_pal: equ $3e
i_data: equ $7e
.text
start:
lea.l mysp(pc),sp *スタックセット
bsr cmdchk *コマンドラインの解析
bsr super *スーパーモードへ
bsr cursol_clr *カーソル消す
bsr name_get *ファイル名を取得し処理する
bsr cursol_recv *カーソル戻す
bsr user *ユーザモードへ
bsr exit *終了処理
DOS _EXIT
*****************************************************************
* ファイル名を取得し、ファイルの読み込みを行う *
*****************************************************************
name_get:
clr.w file_cnt *ファイル数のカウント初期化
bsr chkname *ファイル名に対する前処理
bsr chkext *拡張子が省略されているかチェック
move.w #ARCHIVE,-(sp) *最初のファイルを検索する
pea.l arg(pc) *
pea.l filbuf(pc) *
DOS _FILES *
lea.l 10(sp),sp *
loop:
tst.l d0 *ファイルは見つかったか?
bmi done * 見つからなければ処理完了
bsr setpath *得られたファイル名を
* フルパスに再構成する
bsr main *メイン処理
tst.b esc_flg *エスケープ?
bne done
pea.l filbuf(pc) *つぎのファイルを検索する
DOS _NFILES *
addq.l #4,sp *
bra loop *繰り返す
done:
bsr file_cnt_chk *処理したファイル数のチェック
rts
*****************************************************************
* files実行に先立ってファイル名に前処理を加える *
*****************************************************************
chkname:
pea.l nambuf(pc) *ファイル名を展開する
pea.l arg(pc) *
DOS _NAMECK *
addq.l #8,sp *
tst.l d0 *d0<0なら
bmi name_er * ファイル名の指定に誤りがある
beq nowild *d0=0ならワイルドカード指定なし
cmpi.w #$00ff,d0 *d0≠FFHなら
bne wild * ワイルドカード指定あり
noname: *ファイル名が指定されていない場合
lea.l arg(pc),a0 *バッファargに
lea.l nambuf(pc),a1 * nameckで展開したパス名+'*.ICO'
bsr strcpy * を再構成する
lea.l kome0(pc),a1 *
bsr strcpy *
wild: *ワイルドカードが指定された場合
*何もしなくてよい
cknam0:
rts
nowild: *ワイルドカードが指定されていない場合
move.w #SUBDIR,-(sp) *サブディレクトリであると仮定して
pea.l arg(pc) * 検索してみる
pea.l filbuf(pc) *
DOS _FILES *
lea.l 10(sp),sp *
tst.l d0 *見つかったか?
bmi cknam0 * 見つからなければファイルだろう
lea.l arg(pc),a0 *バッファargに
lea.l komekome(pc),a1 * もとのファイル名+'\*.ICO'
bsr strcat * を再構成する
bra chkname *nameckでファイル名を展開するために
* サブルーチン先頭に戻る
*****************************************************************
* files,nfilesで見付けたファイル名をフルパスに構成し直し *
* arg以降に格納する *
*****************************************************************
setpath:
lea.l arg(pc),a0 *a0=コピー先
lea.l nambuf(pc),a1 *a1=nameckで展開したパス名
bsr strcpy *コピーする
lea.l filbuf(pc),a1 *a1=files,nfilesで見付けたファイル名
lea.l 30(a1),a1
bsr strcpy *連結する
rts
*****************************************************************
* 文字列の連結および複写 *
* リターン時a0は文字列末の00Hを指す *
*****************************************************************
strcat:
tst.b (a0)+ *(a0)は0か?
bne strcat *そうでなければ繰り返す
subq.l #1,a0 *行きすぎたから1つ戻る
strcpy:
move.b (a1)+,(a0)+ *1文字ずつ
bne strcpy *終了コードまでを転送する
subq.l #1,a0 *a0は進み過ぎている
*a0は文字列末の00Hを指す
rts
*****************************************************************
* 拡張子を補う *
*****************************************************************
chkext:
lea.l arg(pc),a0 *ファイル名のアドレス
lea.l dext(pc),a1 *拡張子のアドレス
chkext0:
cmp.b #'.',(a0) *拡張子があるか
beq chkext2
tst.b (a0)+ *(a0)は0か?
bne chkext0 *そうでなければ繰り返す
subq.l #1,a0 *行きすぎたから1つ戻る
chkext1:
move.b (a1)+,(a0)+ *1文字転送
bne chkext1 *終了コードまで繰り返す
chkext2:
rts
*****************************************************************
* コマンドラインのチェックを行う *
*****************************************************************
cmdchk:
lea.l arg(pc),a0 *a0=引数切り出し領域
addq.l #1,a2 *a2=コマンドライン文字列先頭
clr.w crt_mode *画面モードの初期値
cmdchk0:
bsr switch_chk *スイッチのチェック
tst.b (a2) *引数があるか?
beq usage *ないならファイル名が足りない
bsr getarg *ファイル名切り出し
bsr switch_chk *さらにスイッチのチェック
tst.b (a2) *引数があるか?
bne usage * あるなら引数が多い
cmdchk1:
rts
*****************************************************************
* スペースを飛ばしつぎの引数先頭までポインタを進め *
* スイッチがあれば処理してしまう *
*****************************************************************
switch_chk:
bsr skipsp *スペースをスキップする
tst.b (a2) *まだスイッチがあるか?
beq switch_chk2 *ないなら戻る(処理の振り分けを行う)
cmpi.b #'/',(a2) *引数の先頭が
beq switch_chk1 */,-であれば
cmpi.b #'-',(a2) * スイッチ
beq switch_chk1 *
bra switch_chk2 *スイッチでないなら戻る
switch_chk1:
addq.l #1,a2 *'/'や'-'の分ポインタを進める
tst.b (a2) *スイッチがあるか?
beq usage * ないなら使用方表示
move.b (a2)+,d0 *1文字取り出す
bsr toupper *大文字に変換しておく
cmpi.b #'K',d0 *Kスイッチ?
beq ksw * そうなら分岐
cmpi.b #'C',d0
beq csw
cmpi.b #'S',d0
beq ssw
cmpi.b #'L',d0
beq lsw
cmpi.b #'H',d0
beq hsw
bra usage *無効なスイッチが指定された
ksw:
tst.b kflg *スイッチの二重指定チェック
bne usage
st kflg *KスイッチON
bra switch_chk *まだスイッチがあるかもしれない
csw:
tst.b cflg
bne usage
st cflg
bra switch_chk
ssw:
bsr ssw_ana
bra switch_chk
lsw:
bsr lsw_ana
bra switch_chk
hsw:
tst.b hflg
bne usage
st hflg
bra switch_chk
switch_chk2:
rts
*****************************************************************
* Sスイッチの解析 *
*****************************************************************
ssw_ana:
tst.b sflg *Sスイッチの2重指定
bne usage
st sflg
move.b (a2),d0 *1文字取り出す
cmp.b #' ',d0 *Sだけかな
beq ssw_ana9 *画面モードの指定なし
ssw_ana1:
bsr num_read *
cmp.w crt_max(pc),d0 *
bhi usage
move.w d0,crt_mode
subq.l #1,a2 *1文字戻す
ssw_ana9:
rts
*****************************************************************
* Lスイッチの解析 *
*****************************************************************
lsw_ana:
move.b (a2),d0 *1文字取り出す
bsr toupper *大文字に変換しておく
cmp.b #'C',d0 *LCかな
bne usage
tst.b lcflg *LCスイッチの2重指定
bne usage
st lcflg *LCスイッチオン
addq.l #1,a2 *1文字進める
rts
*****************************************************************
* ファイル名を切り出す *
*****************************************************************
getarg:
move.l a0,-(sp) *{レジスタ待避
gtarg0: tst.b (a2) *1)文字列の終端コードか
beq gtarg1 *
cmpi.b #SPACE,(a2) *2)スペースか
beq gtarg1 *
cmpi.b #TAB,(a2) *3)タブか
beq gtarg1 *
* cmpi.b #'-',(a2) *4)ハイフンか
* beq gtarg1 *
cmpi.b #'/',(a2) *5)スラッシュ
beq gtarg1 *
move.b (a2)+,(a0)+ * が現れるまで転送を
bra gtarg0 * 繰り返す
gtarg1: clr.b (a0) *文字列終端コードを書き込む
movea.l (sp)+,a0 *}レジスタ復帰
rts
*****************************************************************
* スペース・TABをスキップする *
*****************************************************************
skipsp0:
addq.l #1,a2
skipsp:
cmpi.b #$20,(a2)
beq skipsp0
cmpi.b #$09,(a2)
beq skipsp0
rts
*****************************************************************
* 小文字→大文字変換ルーチン *
*****************************************************************
toupper:
cmpi.b #'a',d0
bcs toupr0
cmpi.b #'z'+1,d0
bcc toupr0
subi.b #$20,d0
toupr0:
rts
*****************************************************************
* 数字の解析 d0に数字を返す *
*****************************************************************
num_read:
clr.w d0
num_read0:
clr.w d1
move.b (a2)+,d1
sub.b #'0',d1
cmp.b #10,d1
bcc.b num_read1
mulu #10,d0
add.w d1,d0
bra.b num_read0
num_read1:
rts
*****************************************************************
* メイン処理 *
*****************************************************************
main:
tst.b int_flg *画面の初期化は一回だけ
bne main0
bsr scr_int *画面の初期化
main0:
lea.l arg(pc),a0 *ファイル名セット
bsr file_open *ファイルオープン
bsr file_size *ファイルサイズを調べる
cmp.l #766,d6 *対応しているサイズか
beq main1
bsr ico_err
bra main9
main1:
lea.l icon_buff(pc),a4 *バッファに読み込む
bsr file_read *ファイル読む
bsr file_close *ファイルクローズ
bsr pal_conv *パレットデータのコンバート
bsr lc_chk *ロード座標のチェック
bsr icon_prt *アイコンの表示
bsr key_wait *キー入力待ち
add.w #1,file_cnt *ファイル数のカウント+1
main9:
rts
*****************************************************************
* 画面の初期化を行う *
*****************************************************************
scr_int:
st int_flg *画面の初期化は一回だけ
bsr v_wait
* move.w #$100+$c,d1 *画面初期化
* IOCS _CRTMOD
move.w #$1a,d1 *テキスト消去&HOMEポジションへ
IOCS _B_PUTC
IOCS _MS_CUROF *マウスカーソル消す
moveq.l #0,d1 *ソフトキーボード消す
moveq.l #0,d2
IOCS _SKEY_MOD
lea.l func_off_mes(pc),a0 *ファンクションキー消す
bsr mesput
move.w #$20,$e82600 *グラフィック画面オフ
move.w #%00000000_00000011,$e82400 *色モード・実画面サイズ設定
move.w #%00_00_01_10_11100100,$e82500 *Sp>Text>Graphicプライオリティ設定
bsr crtc_set
bsr gpal_set
bsr gr_int
move.w #$2f,$e82600 *グラフィック画面オン
rts
*****************************************************************
* グラフィック画面消去のチェック *
*****************************************************************
gr_int:
tst.b cflg *画面消去あり?
beq gr_int9 *指定無し
movem.l d0-d7/a0-a6,-(sp)
moveq.l #0,d0 *レジスタクリア
moveq.l #0,d1
moveq.l #0,d2
moveq.l #0,d3
moveq.l #0,d4
moveq.l #0,d5
moveq.l #0,d6
moveq.l #0,d7
movea.l d0,a1
movea.l d0,a2
movea.l d0,a3
movea.l d0,a4
movea.l d0,a5
movea.l d0,a6
movea.l #GRAM_MAX,a0
move.w #512,line_cnt
gr_int1:
movem.l d0-d7/a1-a6,-(a0) *14*4=56
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d3,-(a0)
subq.w #1,line_cnt
bne gr_int1
movem.l (sp)+,d0-d7/a0-a6
gr_int9:
rts
*****************************************************************
* グラフィックパレットセット(65536色標準パレット) *
*****************************************************************
gpal_set:
moveq.l #$0001,d0
move.l #$0202,d1
movea.l #GPAL,a0
moveq.l #512/4-1,d6
gpal_set_:
move.w d0,(a0)+
move.w d0,(a0)+
add.l d1,d0
dbra d6,gpal_set_
rts
*****************************************************************
* パレット変換 *
*****************************************************************
pal_conv:
lea.l icon_buff(pc),a0 *変換元
lea.l i_pal(a0),a0
movea.l a0,a1 *変換先
moveq.l #16-1,d0 *パレット数
move.w #$00f8,d7 *マスクデータ
pal_conv1:
move.b (a0)+,d1 *B
move.b (a0)+,d2 *G
move.b (a0)+,d3 *R
addq.w #1,a0
and.w d7,d1
and.w d7,d2
and.w d7,d3
lsr.w #2,d1
lsl.w #3,d3
lsl.w #8,d2
or.w d2,d1
or.w d3,d1
move.w d1,(a1)+
dbra d0,pal_conv1
rts
*****************************************************************
* ロード座標のチェック *
*****************************************************************
lc_chk:
move.w #32,yoko
move.w #32,tate
lea.l dot_tbl(pc),a0 *画面サイズを求める
move.w crt_mode(pc),d0
add.w d0,d0
add.w d0,d0
move.l 0(a0,d0.w),a0
move.w (a0)+,crt_x
move.w (a0),crt_y
clr.w x_pos *ロード座標を初期化
clr.w y_pos
tst.b lcflg *LCスイッチ指定
beq lc_chk2 *指定なし
lc_chk0:
move.w crt_x(pc),d0 *X方向のセンタリング
cmp.w yoko(pc),d0
bcs lc_chk1
sub.w yoko(pc),d0
bclr.l #0,d0
lsr.w #1,d0 *d0を1/2
move.w d0,x_pos
lc_chk1:
move.w crt_y(pc),d0 *Y方向のセンタリング
cmp.w tate(pc),d0
bcs lc_chk2
sub.w tate(pc),d0
bclr.l #0,d0
lsr.w #1,d0 *d0を1/2
move.w d0,y_pos
lc_chk2:
rts
*****************************************************************
* アイコン表示 *
*****************************************************************
icon_prt:
lea.l icon_buff(pc),a1 *ICONバッファ
lea.l i_pal(a1),a0 *パレットデータの先頭
lea.l i_data(a1),a1 *ICONデータの先頭
move.w yoko(pc),d0
lsr.w #1,d0
move.w tate(pc),d1
subq.w #1,d1
mulu d0,d1
add.w d1,a1
tst.b hflg *背景表示スイッチ
bne icon_hai *あり
tst.b lcflg *LCスイッチ指定
beq icon_prt0 *指定なし
move.w x_pos(pc),d0 *ICONデータの表示先
move.w y_pos(pc),d1
move.w yoko(pc),d2
lsr.w #1,d2
sub.w d2,d1
swap d1
clr.w d1
ror.l #6,d1
add.w d0,d0
add.w d0,d1
movea.l d1,a2
adda.l #GRAM,a2
bra icon_prt0_
icon_prt0:
movea.l #GRAM,a2
icon_prt0_:
move.w yoko(pc),a3 *ICONデータの差分
move.w #512,d0 *GARMの差分
sub.w yoko(pc),d0
add.w d0,d0
movea.w d0,a4
move.w #$000f,d6 *マスクデータ
move.w #$00f0,d5
icon_prt1:
move.w yoko(pc),d0 *横ループ
move.w tate(pc),d2 *縦ループ
subq.w #1,d2 *縦-1
lsr.w #1,d0 *横/2-1
subq.w #1,d0
icon_prt2:
move.w d0,d1 *横ループ
icon_prt3:
move.b (a1)+,d3
move.b d3,d4
and.w d5,d4 *上位4ビットを変換
lsr.b #3,d4
move.w 0(a0,d4.w),(a2)+
and.w d6,d3 *下位4ビットを変換
add.w d3,d3
move.w 0(a0,d3.w),(a2)+
dbra d1,icon_prt3
suba.l a3,a1
adda.l a4,a2
dbra d2,icon_prt2
rts
icon_hai:
movea.l #GRAM,a2
movea.w yoko(pc),a3 *ICONデータの差分
move.w #512,d0 *GARMの差分
sub.w yoko(pc),d0
add.w d0,d0
movea.w d0,a4
move.w #$000f,d6 *マスクデータ
move.w #$00f0,d5
icon_hai1:
move.w yoko(pc),d0 *横ループ
lsr.w #1,d0
subq.w #1,d0
move.w tate(pc),d2 *縦ループ
subq.w #1,d2
icon_hai2:
move.w d0,d1 *横ループ
icon_hai3:
move.b (a1)+,d3
move.b d3,d4
and.w d5,d3 *上位4ビットを変換
lsr.b #3,d3
move.w 0(a0,d3.w),d3
and.w d6,d4 *下位4ビットを変換
add.w d4,d4
move.w 0(a0,d4.w),d4
moveq.l #16-1,d7
icon_hai4:
move.w d3,960(a2)
move.w d3,896(a2)
move.w d3,832(a2)
move.w d3,768(a2)
move.w d3,704(a2)
move.w d3,640(a2)
move.w d3,576(a2)
move.w d3,512(a2)
move.w d3,448(a2)
move.w d3,384(a2)
move.w d3,320(a2)
move.w d3,256(a2)
move.w d3,192(a2)
move.w d3,128(a2)
move.w d3,64(a2)
move.w d3,(a2)+
move.w d4,960(a2)
move.w d4,896(a2)
move.w d4,832(a2)
move.w d4,768(a2)
move.w d4,704(a2)
move.w d4,640(a2)
move.w d4,576(a2)
move.w d4,512(a2)
move.w d4,448(a2)
move.w d4,384(a2)
move.w d4,320(a2)
move.w d4,256(a2)
move.w d4,192(a2)
move.w d4,128(a2)
move.w d4,64(a2)
move.w d4,(a2)+
adda.l #32*1024-4,a2
dbra.w d7,icon_hai4
suba.l #16*32*1024-4,a2
dbra d1,icon_hai3
suba.l a3,a1
adda.l a4,a2
dbra d2,icon_hai2
rts
*****************************************************************
* ファイルのOPENを行う *
*****************************************************************
file_open:
move.w #0,-(sp) *ファイルopen
move.l a0,-(sp)
DOS _OPEN
addq.l #6,sp
tst.l d0 *OK?
bmi open_err
move.l d0,d7 *ファイルハンドルセーブ
rts
*****************************************************************
* ファイルのサイズを求める(d6に返す) *
*****************************************************************
file_size:
move.w #2,-(sp)
move.l #0,-(sp)
move.w d7,-(sp)
DOS _SEEK
addq.l #8,sp
tst.l d0 *OK?
bmi read_err
move.l d0,d6
move.w #0,-(sp)
move.l #0,-(sp)
move.w d7,-(sp)
DOS _SEEK
addq.l #8,sp
tst.l d0 *OK?
bmi read_err
rts
*****************************************************************
* ディスクからデータの読み込みを行う *
*****************************************************************
file_read:
move.l d6,-(sp) *データサイズ
move.l a4,-(sp) *バッファアドレス
move.w d7,-(sp) *ファイルハンドル
DOS _READ
lea 10(sp),sp *スタック補正
tst.l d0 *OK?
bmi read_err
cmp.l d6,d0 *全部読めたか
bne read_err
rts
*****************************************************************
* ファイルをCLOSEする *
*****************************************************************
file_close:
move.w d7,-(sp) *ファイルCLOSE
DOS _CLOSE
addq.l #2,sp
rts
*****************************************************************
* キー入力待ち *
*****************************************************************
key_wait:
sf esc_flg
sf next_flg
tst.b kflg *キー入力待ち
beq key_wait1 *指定無し
key_wait0:
bsr key_chk *キー入力チェック
tst.b esc_flg *エスケープ入力有るか
bne key_wait9 *指定有り
tst.b next_flg *ネクスト入力有るか
bne key_wait9 *指定有り
bra key_wait0 *キー入力に戻る
key_wait1:
bsr key_chk *ESCくらいは入力チェック
key_wait9:
rts
*****************************************************************
* キー入力チェック *
*****************************************************************
key_chk:
movea.l #$800,a0
btst.b #1,(a0) *ESCが押されたか?
beq key_chk_ *押されていない
st esc_flg *ESCスイッチON
bra key_chk9
key_chk_:
btst.b #7,1(a0) *BSが押されたか?
beq key_chk0
st esc_flg
bra key_chk9
key_chk0:
btst.b #5,3(a0) *RETURNが押されたか?
bne key_chk7 *押された
key_chk1:
btst.b #5,6(a0) *SPACEが押されたか?
bne key_chk7
key_chk2:
btst.b #6,9(a0) *ENTERが押されたか?
beq key_chk8
key_chk7:
tst.b inkey_flg1
bne key_chk9
st inkey_flg1
st next_flg
bra key_chk9
key_chk8:
sf inkey_flg1
key_chk9:
rts
*****************************************************************
* CRTCの値を設定する *
*****************************************************************
crtc_set:
lea.l crtc_tbl(pc),a0
move.w crt_mode(pc),d0
add.w d0,d0
add.w d0,d0
move.l 0(a0,d0.w),a0
tst.w (a0)+ *HRL=0?
beq crtc_set0
or.b #%0010,$e8e007 *HRLビットを立てる
bra crtc_set1
crtc_set0:
bclr.b #1,$e8e007 *HRLビットを消す
crtc_set1:
movea.l #$e80000,a1
move.w (a0)+,$28(a1) *crtc r20
move.w (a0)+,(a1)+ *crtc r00-r08
move.w (a0)+,(a1)+
move.w (a0)+,(a1)+
move.w (a0)+,(a1)+
move.w (a0)+,(a1)+
move.w (a0)+,(a1)+
move.w (a0)+,(a1)+
move.w (a0)+,(a1)+
move.w (a0),(a1)
rts
*****************************************************************
* 画面の動機待ち *
*****************************************************************
v_wait:
movea.l #$e88001,a0
moveq.l #4,d0
v_wait0:
btst.b d0,(a0)
beq v_wait0
v_wait1:
btst.b d0,(a0)
bne v_wait1
rts
*****************************************************************
* カーソル消す *
*****************************************************************
cursol_clr:
move.b $992.w,cur_save
beq cursol_clr9
IOCS _OS_CUROF
cursol_clr9:
rts
*****************************************************************
* カーソル戻す *
*****************************************************************
cursol_recv:
tst.b cur_save
beq cursol_recv9
IOCS _OS_CURON
cursol_recv9:
rts
*****************************************************************
* スーパーモードにする *
*****************************************************************
super:
clr.l -(sp) *スーパーバイザモードへ移行
DOS _SUPER
addq.l #4,sp
move.l d0,sp_save
rts
*****************************************************************
* ユーザーモードにする *
*****************************************************************
user:
move.l sp_save(pc),-(sp) *ユーザーモードへ
DOS _SUPER
addq.l #4,sp
rts
*****************************************************************
* 処理したファイル数をチェックする *
*****************************************************************
file_cnt_chk:
tst.w file_cnt *処理したファイルは0個か
bne file_cnt_chk1 *違う
bsr no_file *ファイルが無かった
file_cnt_chk1:
rts
*****************************************************************
* 処理するファイルがなかった *
*****************************************************************
no_file:
lea.l no_file_mes(pc),a0
bsr mesput
rts
*****************************************************************
* ファイル名エラー *
*****************************************************************
name_er:
lea.l name_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* ファイルが見付からない *
*****************************************************************
open_err:
lea.l arg(pc),a0
bsr mesput
lea.l open_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* 読み込みエラー *
*****************************************************************
read_err:
lea.l arg(pc),a0
bsr mesput
lea.l read_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* ICOファイルじゃない *
*****************************************************************
ico_err:
bsr file_close
lea.l arg(pc),a0
bsr mesput
lea.l ico_er_mes(pc),a0
bsr mesput
rts
*****************************************************************
* 使用方表示 *
*****************************************************************
usage:
lea.l usage_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* メッセージ表示 *
*****************************************************************
mesput:
* move.w #STDERR,-(sp) *標準エラー出力へ
move.w #STDOUT,-(sp) *標準出力へ
move.l a0,-(sp) *メッセージを
DOS _FPUTS *出力する
addq.l #6,sp *スタック補正
rts
*****************************************************************
* 終了処理 *
*****************************************************************
exit:
IOCS _MS_INIT *キーバッファクリア
moveq.l #-1,d1
IOCS _SKEY_MOD
move.w #-1,-(sp)
DOS _KFLUSH
addq.l #2,sp
rts
*****************************************************************
* エラー処理2 *
*****************************************************************
exit2:
bsr exit
move.w #1,-(sp) *終了コード1を持って
DOS _EXIT2 * エラー終了
*****************************************************************
* データエリア *
*****************************************************************
.data
.even
usage_mes:
.dc.b 'ICO Loader V0.02 by A.MUKAWA',CR,LF
.dc.b '機能:ICOファイルを表示します。',CR,LF
.dc.b '用法:LDICO [スイッチ] ファイル名',CR,LF
.dc.b CR,LF
.dc.b ' /K 表示後にキー入力待ち。',CR,LF
.dc.b ' /C 表示前に画面消去。',CR,LF
.dc.b ' /LC 画面中央に表示。',CR,LF
.dc.b ' /H 背景表示モード。',CR,LF
.dc.b 0
no_file_mes:
.dc.b '表示できるファイルがありません!',CR,LF,0
name_er_mes:
.dc.b 'ファイル名の指定に間違いがあります!',CR,LF,0
open_er_mes:
.dc.b ' が見つかりません!',CR,LF,0
read_er_mes:
.dc.b ' の読み込みエラーが発生しました!',CR,LF,0
ico_er_mes:
.dc.b ' は表示できません!',CR,LF,0
crlf_mes:
.dc.b CR,LF,0
func_off_mes:
.dc.b $1b,$5b,$3e,$31,$68,0
dext:
.dc.b '.ICO',0 *補う拡張子
komekome:
.dc.b '\'
kome0:
.dc.b '*.ICO',0
kflg:
.dcb.b 1,0 */Kスイッチon/offフラグ(=0...off,<>0...on)
cflg:
.dcb.b 1,0 */Cスイッチon/offフラグ(=0...off,<>0...on)
sflg:
.dcb.b 1,0 */Sスイッチon/offフラグ(=0...off,<>0...on)
lcflg:
.dcb.b 1,0 */LCスイッチon/offフラグ(=0...off,<>0...on)
hflg:
.dcb.b 1,0 */Hスイッチon/offフラグ(=0...off,<>0...on)
int_flg:
.dcb.b 1,0 *
inkey_flg1:
.dcb.b 1,1 *
.even
crt_max:
.dc.w 3-1
crtc_tbl:
.dc.l mode0
.dc.l mode1
.dc.l mode2
crtc_data:
* HRL R20 R00 R01 R02 R03 R04 R05 R06 R07 R08
mode0: .dc.w $00,$316, $89, $0E, $2C, $6C,$237, $05, $28,$228, $1B *512*512 正方形
mode1: .dc.w $01,$311, $44, $05, $0A, $3A,$237, $05, $28,$228, $1B *384*256
mode2: .dc.w $00,$310, $37, $04, $08, $30,$1E7, $05, $28,$208, $1B *320*224 24k
dot_tbl:
.dc.l dot0
.dc.l dot1
.dc.l dot2
dot_data:
dot0: .dc.w 512,512
dot1: .dc.w 384,256
dot2: .dc.w 320,224
*****************************************************************
* ワークエリア *
*****************************************************************
.bss
.even
filbuf:
.ds.b 53 *ファイル情報格納バッファ
nambuf:
.ds.b 92 *ファイル名展開用バッファ
arg:
.ds.b 256 *ファイル名バッファ
.even
file_cnt:
.ds.w 1 *ファイル数のカウント用バッファ
sp_save:
.ds.l 1
yoko:
.ds.w 1 *画像の横(X)サイズ
tate:
.ds.w 1 *画像の縦(Y)サイズ
crt_x:
.ds.w 1 *画面のXサイズ
crt_y:
.ds.w 1 *画面のYサイズ
x_pos:
.ds.w 1 *ロード時のX座標
y_pos:
.ds.w 1 *ロード時のY座標
crt_mode:
.ds.w 1 *画面モード
line_cnt:
.ds.w 1
esc_flg:
.ds.b 1 *
next_flg:
.ds.b 1 *
cur_save:
.ds.b 1 *
.even
icon_buff:
.ds.b 766 *アイコンバッファ
my_stack:
.ds.l 1024
mysp:
.even
.end start